/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import src.ListaMensajes;
import src.ListaUsuarios;
import src.Mensaje;
import src.Permisos;
import src.Usuario;
import src.exceptions.eSessionNoValida;

/**
 *
 * @author pabloavila
 */
public class Viewer extends HttpServlet {
    
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession(false);
        String page = "/index.jsp";
        try {
                    

            // Miramos a ver si la session esta activa
            if ((Boolean)session.getAttribute("ses_activa")){
                // Mirariamos si hay que hacer Manage o Muro
                String ac = (String)request.getParameter("action");
                if (ac != null && ac.equals("Manage"))
                    pintarAdmin(session,out);
                else if(ac!= null && ac.equals("Muro")) pintarMuro(session,out);
                else pintarMuro(session,out);
            }
            else{
                throw new eSessionNoValida("La session no es valida, vuelva a iniciar session");
            }
            
            // Leer la lisifa de mensajes y mostrarlos
            
        }catch (eSessionNoValida e){
            page = "/index.jsp";
            // Pasarle los valores por request a viewer
            session.setAttribute("ses_notify",e.toString());
            session.setAttribute("ses_sign",false);
            dispatch(request,response,page);
        }catch(Exception e){
            page = "/index.jsp";
            // Pasarle los valores por request a viewer
            session.setAttribute("ses_notify",e.toString());
            session.setAttribute("ses_sign",false);
            dispatch(request,response,page);
        }

        finally {
            out.close();
        }
    }

    protected void dispatch(HttpServletRequest request,
        HttpServletResponse response,String page)
        throws  javax.servlet.ServletException, java.io.IOException {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
        dispatcher.forward(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Prepares the content to show";
    }// </editor-fold>

    /* Esta funcion pinta el muro
     * Dependiendo del usuario muestra unos valores u otros
     * 1) Si el usuario es invitado solo mostrara el muro
     * 2) Si es usuario registrado mostrara el formulario de mensajes
     * 3) Y si es administrador mostrara un enlace a la administracion
     */
    private void pintarMuro(HttpSession session, PrintWriter out) {

        

        // Miramos la session y vemos de que usuario se trata
        boolean ok = (Boolean)session.getAttribute("ses_ok");
        Usuario u = (Usuario)session.getAttribute("ses_usr");

        out.println("<html>");
        out.println("<head>");
        out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"img/style_1.css\" />");
        out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        out.println("<title>El Tabique - PAW</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<div id=\"barra\">");

        // Segun el tipo de usuario que sea mostraremos en la barra unos enlaces u otros
        // Administrador
        if (u.getPermisos().equals(Permisos.ADMIN) && ok)
            out.println("<p>Sesion como: <span class=\"autor\">"+ u.getNombre() +": "+ u.getPermisos().toString() + " </span><a href=\"Viewer?action=Manage\" dest=\"_parent\">Administrar</a><a href=\"Dispatcher?action=Logout\" dest=\"_parent\">Cerrar Sesion</a></p>");
        else if(u.getPermisos().equals(Permisos.USER) && ok)
        // Usuario
            out.println("<p>Sesion como: <span class=\"autor\">"+ u.getNombre() + ": " + Permisos.USER.toString() + " </span><a href=\"Dispatcher?action=Logout\" dest=\"_parent\">Cerrar Sesion</a></p>");
        else
            out.println("<p>Sesion como: <span class=\"autor\">"+ u.getNombre() + ": " + Permisos.GUEST.toString() + " </span><a href=\"Dispatcher?action=Logout\" dest=\"_parent\">Cerrar Sesion</a></p>");
        
        out.println("</div>");
        out.println("<div id=\"cuerpo\">");

        // Ahora vamos a pintar todos los mensajes
        ListaMensajes lm = (ListaMensajes) session.getAttribute("ses_msg");
        Iterator e = lm.getLista().iterator();
        // Para dar formato a la fecha
        SimpleDateFormat formatter;
        formatter = new SimpleDateFormat("dd.MM.yyyy");
        while (e.hasNext()) {
            Mensaje m = (Mensaje) e.next();
            String t = m.getTexto();
            String a = m.getAutor().toString();
            String f = formatter.format(m.getFecha());
            // Mostramos los mensajes
            out.println("<div id=\"mensajes\">");
            out.println("<p class=\"msg\">" + t +"</p>");
            out.println("<p class=\"fecha\"><span class=\"autor\">" + a + " </span>" + f + "</p>");
            out.println("</div>");
        }

        // El formulario
        boolean a = u.getPermisos().equals(Permisos.ADMIN) && ok;
        boolean b = u.getPermisos().equals(Permisos.USER) && ok;

        if (a || b){
            out.println("<div id=\"formulario\">");
            out.println("<form action=\"Dispatcher\" method=\"post\">");
            out.println("<fieldset class=\"fs\">");
            out.println("<legend class=\"fs\">Nuevo Mensaje</legend>");
            out.println("<textarea name=\"texto\" class=\"ta\"></textarea>");
            out.println("<span class=\"msgautor\">" + u.getNombre() + "</span>");
            out.println("<span class=\"msgsubmit\"><input type=\"submit\" name=\"submit\" value=\"Post!\" class=\"button\"/></span>");
            out.println("</fieldset>");
            out.println("<input type=\"hidden\" name=\"action\" value=\"Post\" />");
            out.println("</form>");
            out.println("</div>");
        }

        out.println("</div>");

        // Miramos a ver si hay algo que notificar: ses_notify

        String n = (String) session.getAttribute("ses_notify");
        if (n != null){
            boolean sign = (Boolean) session.getAttribute("ses_sign");
            out.println("<div id=\"notification\" style=\"display:block;\">");
            if (sign)
                out.println("<p class=\"positive\">" + n + "</p>");
            else
                out.println("<p class=\"negative\">" + n + "</p>");
            out.println("</div>");
        }
        out.println("</body>");
        out.println("</html>");

        // En teoria, una vez mostrada la notificacion la eliminamos
        session.removeAttribute("ses_notify");

    
        
    
    }


    private void pintarAdmin(HttpSession session, PrintWriter out){

        // Miramos la session y vemos de que usuario se trata
        boolean ok = (Boolean)session.getAttribute("ses_ok");
        Usuario u = (Usuario)session.getAttribute("ses_usr");

        out.println("<html>");
        out.println("<head>");
        out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"img/style_1.css\" />");
        out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        out.println("<title>El Tabique - PAW</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<div id=\"barra\">");

        // Segun el tipo de usuario que sea mostraremos en la barra unos enlaces u otros
        // Administrador
        if (u.getPermisos().equals(Permisos.ADMIN) && ok){
            out.println("<p>Sesion como: <span class=\"autor\">"+ u.getNombre() +": "+ u.getPermisos().toString() + " </span><a href=\"Viewer?action=Muro\" dest=\"_parent\">Muro</a><a href=\"Dispatcher?action=Logout\" dest=\"_parent\">Cerrar Sesion</a></p>");
            out.println("</div>");
        }

        // Formulario de crear usuario
        out.println("<div id=\"cuerpo\">");
        out.println("<div id=\"usuarios\">");
	out.println("<fieldset class=\"fs\">");
	out.println("<legend class=\"fs\">El Tabique - Gestion de Usuarios</legend>");
	out.println("<div class=\"place\">");
	out.println("<form action=\"Dispatcher\" method=\"post\">");
	out.println("<p><label for=\"fs\">Nombre</label><input type=\"text\" name=\"name\" class=\"field\"/><input type=\"submit\" value=\"Crear\" class=\"button2\"/></p>");
	out.println("<input type=\"hidden\" name=\"action\" value=\"AddUser\" />");
	out.println("</form>");
	out.println("</div>");

        // Formulario de borrar usuario
	out.println("<div class=\"place\">");
	out.println("<form action=\"Dispatcher\" method=\"post\">");
	out.println("<p><label for=\"fs\">Nombre</label><input type=\"text\" name=\"name\" class=\"field\"/><input type=\"submit\" value=\"Borrar\" class=\"button2\"/></p>");
	out.println("<input type=\"hidden\" name=\"action\" value=\"RemoveUser\" />");
	out.println("</form>");
	out.println("</div>");

        // Gestion de usuarios
	out.println("<fieldset class=\"gu\">");
	out.println("<legend class=\"tu\">Permisos</legend>");
	out.println("<form action=\"Dispatcher\" method=\"post\">");

        // Mirar la lista de usuarios
        ListaUsuarios lu = (ListaUsuarios) session.getAttribute("ses_list");
        Iterator e = lu.getLista().iterator();
        // Para dar formato a la fecha
        while (e.hasNext()) {
            Usuario m = (Usuario) e.next();
            if (!m.equals(u)){
                String nom = m.getNombre();
                Permisos p = m.getPermisos();

                out.println("<p class=\"gestionautor\">" + m.toString() + "</p>");
                out.println("<div class=\"placebuttons\">");

                if (p.equals(Permisos.GUEST)) out.println("<input type=\"submit\" value=\"Invitado\" class=\"button3\" disabled/>");
                else out.println("<input type=\"submit\" name=\"per\" value=\"GUEST\" class=\"button3\"/>");

                if (p.equals(Permisos.USER)) out.println("<input type=\"submit\" value=\"Usuario\" class=\"button3\" disabled/>");
                else out.println("<input type=\"submit\" name=\"per\" value=\"USER\" class=\"button3\"/>");

                if (p.equals(Permisos.ADMIN)) out.println("<input type=\"submit\" value=\"Administrador\" class=\"button3\" disabled/>");
                else out.println("<input type=\"submit\" name=\"per\" value=\"ADMIN\" class=\"button3\" />");

                out.println("<input type=\"hidden\" name=\"name\" value=\""+nom+"\" />");
                out.println("<input type=\"hidden\" name=\"action\" value=\"EditUser\" />");
                out.println("</div>");
                out.println("</form>");
                out.println("</fieldset>");

            }
        }
        
        out.println("</fieldset>");
        out.println("</div>");
        out.println("</div>");

        // Miramos a ver si hay algo que notificar: ses_notify

        String n = (String) session.getAttribute("ses_notify");
        if (n != null){
            boolean sign = (Boolean) session.getAttribute("ses_sign");
            out.println("<div id=\"notification\" style=\"display:block;\">");
            if (sign)
                out.println("<p class=\"positive\">" + n + "</p>");
            else
                out.println("<p class=\"negative\">" + n + "</p>");
            out.println("</div>");
        }
        out.println("</body>");
        out.println("</html>");

        // En teoria, una vez mostrada la notificacion la eliminamos
        session.removeAttribute("ses_notify");



    }

}
